<?php
class StringCut{
/*
 * utf8格式下的中文字符截断 
 *  UTF-8编码的字符可能由1~3个字节组成， 具体数目可以由第一个字节判断出来。(理论上可能更长，但这里假设不超过3个字节)
 * 第一个字节大于224的，它与它之后的2个字节一起组成一个UTF-8字符
 * 第一个字节大于192小于224的，它与它之后的1个字节组成一个UTF-8字符
 * 否则第一个字节本身就是一个英文字符（包括数字和一小部分标点符号）。
 * $sourcestr 是要处理的字符串,$cutlength 为截取的长度(即字数),$start开始位置
 */
 function cut_str($sourcestr,$cutlength,$start=1){
            $returnstr='';
            $i=0;
            $n=0;
            $isStart=false;
            $start=$start-1;
            $str_length=strlen($sourcestr);//字符串的字节数
            while ($i<$str_length){
                        if($isStart && $n>=$cutlength) break;  

                        if(!$isStart && $n==$start){
                                 $isStart=true;
                                 $n=0;
                        }
                        
                        $ascnum=Ord($sourcestr[$i]);//得到字符串中第$i位字符的ascii码
                        if ($ascnum>=224){    //如果ASCII位高与224，
                              $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符          
                              $n++;            //字串长度计1
                              $i=$i+3;         //实际Byte计为3
                              // もし次の「ﾞ,ﾟ」 なら　
                              if(Ord($sourcestr[$i])==239 && Ord($sourcestr[$i+1])==190 && 
                                      (Ord($sourcestr[$i+2])==158 || Ord($sourcestr[$i+2])==159))
                                               $n--;  
                        }elseif ($ascnum>=192){ //如果ASCII位高与192，
                              $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
                              $i=$i+2;            //实际Byte计为2
                              $n++;            //字串长度计1
                        }else{ //如果是大写字母，
                                $returnstr=$returnstr.substr($sourcestr,$i,1);
                                $i=$i+1;            //实际的Byte数仍计1个
                                $n++;           
                        }
                        if(!$isStart)
                             $returnstr="";
               }
              return $returnstr;
 }

            /*
             * GB2312编码方式的截断
             */
            function msubstr($str, $start, $len) { 
                   if (strlen($str)-$start < $len)  
                           return false;
                   $tmpstr = "";
                   $strlen = $start + $len;
                   for($i = 0; $i < $strlen; $i++) {
                        if(ord(substr($str, $i, 1)) > 0xa0) {   //0xa0 表示中文汉字编码的第一个编码字符ASCII 码值都大于0xa0
                              $tmpstr .= substr($str, $i, 2);
                              $i++;
                        } else
                              $tmpstr .= substr($str, $i, 1);
                   }
                   return $tmpstr;
            }
    
    
}
?>
